/*****************************************************************************
简介：lz 自用脚本主脚本，更新为 ahk2 的脚本。
作者：lz
编码：utf-8
操作系统：windows11
ahk 版本：2.02
最近编辑时间：2025年04月29日
其他说明：注释行宽度为78个字符
        ：可使用 Capslock 和 Appskey 做前缀
******************************************************************************
*/

;============================================================================
;; 自动执行段
; 保证以管理员权限运行此脚本。
if not A_IsAdmin
{
    Run '*RunAs "' A_AhkPath  '" /restart "' A_ScriptFullPath '"'  ; 以管理员权限运行
    ExitApp
}

;----------------------------------------------------------------------------
#SingleInstance force

; 引用的库。有些库需要放在确切的位置，不能集中到这里
#Include %A_ScriptDir%\lzLib  ; 为后续的 #Include 和 FileInstall 改变工作目录.
#Include lzShowTip.ahk
#Include LZMenu.ahk
#Include MouseGesture.ahk
#Include lockKeyboard.ahk

processSetPriority("High")
; SplitPath(A_ScriptDir,,,,, &diskLetter) ; 脚本所在盘符
; wsr := diskLetter . "\wsr"
; envSet("wsr", wsr) ; U盘上的程序的唯一入口
wsr := envget("wsr")
scoop := envget("scoop")
; RunWait "POWERCFG /S 381b4222-f694-41f0-9685-ff5bb260df2e",, "Hide"
showKeysState() ; 运行脚本时先检测一下大小写状态
addItem()  ; 添加托盘图标右键条目
A_IconTip := "千山鸟飞绝，`n万径人踪灭。`n孤舟蓑笠翁，`n独钓寒江雪。"
return ; 上面是自动执行段

;============================================================================
showKeysState() {
    ;
    ; 显示大小写等键的状态
    ;
    if GetKeyState("CapsLock", "T")
        sIconName := "y"
    else sIconName := "n"
    if GetKeyState("NumLock", "T")
        sIconName .= "y"
    else sIconName .= "n"
    if GetKeyState("ScrollLock", "T")
        sIconName .= "y"
    else sIconName .= "n"
    traySetIcon("Icon\" . sIconName . ".ico")
}

;----------------------------------------------------------------------------
lzRun(programName, processName:="", message:="", title:="", wintext:=""
        , params*) {
    if not processName
        splitPath(programName, &processName)
    title := title ? title . " ahk_exe " . processName
            : "ahk_exe " . processName
    message := message || processName
    detectHiddenWindows(True)
    if WinExist(title, wintext) {
        if WinActive()
            winMinimize()
        else
            winActivate()
    } else {
        lzShowTip("正在启动 " message)
        theParam := ""
        for _,param in params
            theParam .= ' "' . param . '"'
        Run(programName . theParam, RegExReplace(programName,  "[^\\]*$"))
    }
    detectHiddenWindows(False)
}

;----------------------------------------------------------------------------
; 开关 aria2c
toggleAria2c() {
    if processExist("aria2c.exe") {
        if (msgbox("确定要杀死 aria2c 进程吗？",, "4") == "Yes")
            processClose("aria2c.exe")
    }
    else  {
        run(scoop . "\shims\aria2c.exe -D "
                "--conf-path=" . wsr . "\Scripts\aria2\aria2.conf",,"Hide")
        lzShowTip("后台启动 aria2c 下载器")
    }
}

;----------------------------------------------------------------------------
; 设置托盘图标的单击双击行为
addItem() {
    A_TrayMenu.insert("1&", "LZMenu", onClick)
    A_TrayMenu.default := "LZMenu"
    A_TrayMenu.disable("LZMenu")
    A_TrayMenu.clickCount := 1

    A_TrayMenu.clicks := 0  ; 记录点击次数
    onClick(name, pos, theMenu) {
        if (theMenu.clicks == 0) {
            theMenu.clicks := 1
            setTimer(timeOut, -300)
        } else {
            theMenu.clicks += 1
        }
    }
    timeOut() {
        if (A_TrayMenu.clicks == 1)
            lzMenu3.showWin()
        if (A_TrayMenu.clicks == 2)
            listLines
        A_TrayMenu.clicks := 0
    }
}

;============================================================================
; 前缀键会失去它原有的功能。重新定义一下。参照 自定义组合键 说明。
*CapsLock::{    ; 加 * 号是为了与键盘一致。
    If GetKeyState("CapsLock", "T")
        SetCapsLockState "Off"
    Else
        SetCapsLockState "On"
    showKeysState()
}

;----------------------------------------------------------------------------
; 我的火狐浏览器
CapsLock & w::{
    keywait("CapsLock")
    lzRun(wsr . "\Program\Mozilla\Mozilla Firefox X64\firefox.exe"
            , "firefox.exe", "火狐浏览器", "— Mozilla Firefox",
            , "-profile" , scoop . "\persist\firefox\lz_profile")
}

; 打开vim文本编辑器
CapsLock & e::{
    keywait("CapsLock")
    lzRun(wsr . "\Program\Vim\runtime\gvim.exe"
            , "gvim.exe", "gvim 编辑器", "- GVIM")
}

; 打开SumatraPDF阅读器
CapsLock & r::lzRun(scoop . "\shims\SumatraPDF.exe"
        , "SumatraPDF.exe" , "SumatraPDF 阅读器", "- SumatraPDF")

; 启动Total Commander
CapsLock & t::{
    keywait("CapsLock")
    lzRun(wsr . "\Program\totalcmd\TOTALCMD64.exe"
            , "TOTALCMD64.EXE" , "Total Commander", "Total Commander (x64)")
}

CapsLock & o::lzRun(wsr . "\Program\无界\u.exe",,"无界浏览")
CapsLock & p::lzRun(wsr . "\Program\自由门\fgp.exe",,"自由门")

; 启动终端模拟器
CapsLock & a::{
    keywait("CapsLock")
    lzRun(scoop . "\shims\wt.exe"
            , "WindowsTerminal.exe" , "WindowsTerminal")
}

; 打开东方财富独立交易软件
CapsLock & s:: lzRun(wsr . "\portable\ToolsStock\dfcfzq\maintrade.exe"
        , "maintrade.exe", "东方财富独立交易端")

; 打开 double commander

; 东方财富通
CapsLock & f::lzRun(
        wsr . "\portable\ToolsStock\eastmoney\swc8\mainfree.exe"
        , "mainfree.exe", "东方财富通", "东方财富终端", "tradeWnd")


; 启动终端模拟器
CapsLock & z::{
    Run('wt.exe `; split-pane -p "Windows PowerShell"')
}

CapsLock & c::{
    lzRun(wsr . "\portable\misc\KeePass\current\KeePass.exe"
            ,,, "LZ.kdbx - KeePass")
    winWait("LZ.kdbx",,6)
    If (WinExist("Open Database - LZ.kdbx")
            or WinExist("打开数据库 - LZ.kdbx"))
    {
        WinActivate()
        Send "zhang{+}hao`=3366{Enter}" ; 等号要转义才能正常发送
    }
}

; 启动 Chrome 浏览器
CapsLock & b::{
    keywait("CapsLock")
    lzRun(wsr . "\Portable\misc\Chrome\Chrome.lnk"
            ,"chrome.exe","谷歌浏览器", "- Google Chrome")
}

CapsLock & x::lzRun(scoop . "\apps\weixin\current\Weixin.exe"
        , "WeChat.exe", "微信", "微信 ahk_class WeChatMainWndForPC")

CapsLock & n::toggleAria2c()

;----------------------------------------------------------------------------
; 类Vim方向键
CapsLock & h::Send("{Left}")
CapsLock & j::Send("{Down}")
CapsLock & k::Send("{Up}")
CapsLock & l::Send("{Right}")

;----------------------------------------------------------------------------
; 用脚本图标显示各锁定键的状态
~NumLock::
~ScrollLock::
{
    showKeysState()
}

;============================================================================
AppsKey::send("{AppsKey}")  ; 重新定义一下以便后面当作前缀
#AppsKey::send("{AppsKey}")
!AppsKey::Reload ; 调试时用着方便
#SuspendExempt  ; 从 Suspend 中豁免以下热键.
^AppsKey::Suspend
; 儿子总爱玩我的鼠标键盘，离开时用这个当键盘锁。
AppsKey & l::lockKeyboard()
; 台式机也可以使用键盘一键关机
AppsKey & ScrollLock::shutdown(9)
#SuspendExempt False  ; 禁用下面任何热键/热字符串的豁免.
+AppsKey::Pause -1

;----------------------------------------------------------------------------
; 修改注册表时需要经常重启资源管理器
AppsKey & r::{
    run "cmd /c taskkill /im explorer.exe /f & start explorer.exe",, "Hide"
}

AppsKey & t::msgbox RunWaitOne("powercfg /l")
RunWaitOne(command) {
    shell := ComObject("WScript.Shell")
    ; 通过 cmd.exe 执行单条命令
    exec := shell.Exec(A_ComSpec " /C " command)
    ; 读取并返回命令的输出
    return exec.StdOut.ReadAll()
}

AppsKey & n::return

AppsKey & m::{
    run(A_AhkPath " test.ahk")
}

AppsKey & <::lzShowTip("显示三秒？", 50, 0xAA3333)

AppsKey & >::lzShowTip("一二三四五六七八九十一二三四五六七八九十",, 0x0000AA)

AppsKey & ?:: {
    lzShowTip()
    tooltip()
}

#HotIf WinActive("ahk_exe explorer.exe")
F4::
openSelectedItems(hk) {
    ;;; 获取当前资源管理器中选中的文件路径
    paths := ""
    hwnd := WinGetID("A")
    for window in ComObject("Shell.Application").Windows {
        if (window.hwnd == hwnd) {
            for item in window.Document.SelectedItems {
                ; 过滤掉目录
                if (instr(filegetattrib(item.path), "D")) {
                    continue
                }
                paths .= '"' . item.path . '" '
            }
            if (paths == "") {
                msgbox("未选择任何文件！")
            } else {
                run(wsr . "\Program\TotalCMDTools\F4Menu\F4Menu.exe -p " . paths)
            }
            break
        }
    }
}
#HotIf
